package de.akabahn.ebd.stw.zdxfc.prs.commande;

import org.apache.log4j.Logger;

import de.akabahn.ebd.stw.zdxfc.prs.commande.elemente.Taste;

/**
 * Hintergrundtask, der in regelmaessigen Abstaenden laeuft um zeitabhaengige Bedingungen zu pruefen.<br>
 * Die regelmaessige Ausfuehrung wird durch den <code>ScheduledExecutorService</code> verwaltet.
 * 
 * @author Peter Eimann
 * @since 1.0
 * @version 1.2
 */
public class ZDXFCCommandeBackgroundTask implements Runnable {
	private static final Logger LOG = Logger.getLogger(ZDXFCCommandeBackgroundTask.class);

	private ZDXFCCommandeMain main;
	private long counter;
	
	/**
	 * Initialisierung der Klasse
	 * 
	 * @param main Referenz auf die Hauptklasse
	 */
	public ZDXFCCommandeBackgroundTask(ZDXFCCommandeMain main) {
		this.main = main;
	}
	
	/**
	 * Beim Aufruf dieser Methode werden folgende Pruefungen durchgefuehrt:<br>
	 * <ol>
	 * <li>Ausleuchtung einer Taste blinkt: Die Ausleuchtung wird abwechselnd ein- und ausgeschaltet</li>
	 * <li>Loslasszeit einer Taste erreicht: Aufruf von <code>Taste.tasteLosgelassen()</code></li>
	 * </ol>
	 * Exceptions, die waehrend des Ablaufs der Methode auftreten, werden im Logfile protokolliert.
	 * @see Taste#isBlinkt()
	 * @see Taste#lampeAus()
	 * @see Taste#lampeAn()
	 * @see Taste#tasteLosgelassen()
	 */
	@Override
	public void run() {
		Taste taste = null;
		
		try {
			for (String id : main.getTasten().keySet()) {
				taste = main.getTaste(id);
				
				if (taste.isBlinkt()) {
					if (counter % 2 == 0) {
						taste.lampeAus();
					} else {
						taste.lampeAn();
					}
				}
				
				if (taste.getLoslassZeit() > 0) {
					if (System.currentTimeMillis() >= taste.getLoslassZeit()) {
						LOG.debug("Taste " + taste.getId() + " Loslasszeit erreicht");
						taste.tasteLosgelassen();
					}
				}
			}
		} catch (Exception e) {
			LOG.error("Exception caught in background task", e);
		} finally {
			counter++;
		}
	}

}
